package com.hotel.common.user.listener;

import cn.hutool.core.util.RandomUtil;
import com.hotel.common.config.RabbitKeyConfig;
import com.hotel.common.config.RedisKeyConfig;
import com.hotel.common.param.MqMsg;
import com.hotel.core.sms.AliSmsUtil;
import com.hotel.common.user.entity.SmsLog;
import com.hotel.common.user.mapper.SmsLogMapper;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.concurrent.TimeUnit;

@Component  // 监听者
public class SmsRabbitListener {

    @Autowired
    private SmsLogMapper smsLogMapper;

    // Spring Data Redis提供的一个类，用于在处理字符串数据时简化与Redis数据库的交互。
    // 它提供了一些常见的Redis操作方法，比如设置和获取字符串值。
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     *
     * 队列的 消费者
     * 队列的消费者
     *
     *  * 发送注册短信业务
     *      * 1.生成随机证码
     *      *
     *      * 2.发送阿里云短信
     *      *
     *      * 3.存入redis中验证码
     *      *
     *      * 4.手机号验证码记录日志表
     */

    @RabbitListener(queues = RabbitKeyConfig.Q_SENDSMS)
    public void smsListener(MqMsg msg){

        System.out.println("msg = " + msg);

        // 1.生成随机验证码
        // 生成5位随机验证码
//        String code = RandomUtil.randomInt(10000,99999)+"";

       String  code = "8888";

        // 2. 发送阿里云短信
        String phone = (String) msg.getMsg(); // 雪花算法里封装的 获取消息内容

        System.out.println("phone = " + phone + "验证码---=" + code);

       // 发送短信验证码，
        boolean result = AliSmsUtil.sendCode(phone,code);

        if (true){

        // 获得 ====》 雪花算法里 封装的消息类型
        // 根据消息的类型（由 msg.getType() 返回的值）来决定下一步操作

            switch (msg.getType()){
                case 1:
                // redis 缓存验证码 ， 当消息类型为 1 时，将验证码存储到 Redis 中。
                //opsForValue().set(key, value, timeout, unit) 方法将键 key 和值 value 存储到 Redis 中，并设置超时时间（过期时间）。
                // 当超时时间到达后，Redis 会自动删除这个键值对。

                    stringRedisTemplate.opsForValue().set(RedisKeyConfig.SMS_RCODE + phone,code,RedisKeyConfig.SMS_RCODE_TIME,TimeUnit.SECONDS);

                    // 手机号验证码记录日志表
                    //这段代码将手机号、短信类型、短信内容和记录时间插入到名为 SmsLog 的日志表中。
                    smsLogMapper.insert(new SmsLog(phone,"注册验证码",phone + "注册验证码"+code,new Date()));

                    // 登录验证码
                case 2:

                    stringRedisTemplate.opsForValue().set(RedisKeyConfig.SMS_LCODE + phone,code,RedisKeyConfig.SMS_RCODE_TIME,TimeUnit.SECONDS);

                    smsLogMapper.insert(new SmsLog(phone,"登录验证码", phone + "登录验证码"+code,new Date()));

                    break;
                    // 找回密码
                case 3:

                    stringRedisTemplate.opsForValue().set(RedisKeyConfig.SMS_LCODE + phone,code,RedisKeyConfig.SMS_RCODE_TIME,TimeUnit.SECONDS);

                    smsLogMapper.insert(new SmsLog(phone,"找回密码-验证码", phone + "找回密码-验证码"+code,new Date()));


                    break;
                default:
                    System.out.println("其他消息处理");
                    break;

        }
    }
     }


}
